#include "TestEstrategiaDiferida.h"
#include "../src/estrategiaRecurso/EstrategiaRecursoEscrituraDiferida.h"
#include "../src/estrategiaRecurso/Archivo.h"
#include "../src/estrategiaRecurso/Buffer.h"
#include "../src/FuncionesUtiles.h"
#include "includes.h"

TestEstrategiaDiferida::TestEstrategiaDiferida() {

}

TestEstrategiaDiferida::~TestEstrategiaDiferida() {

}

void TestEstrategiaDiferida::run() {

	this->testSimple();
	this->testComplejo();
}

void TestEstrategiaDiferida::testSimple() {

	cantBytes tamanioBloque = 5;
	string path = "Archivos/testEstrategiaDiferidaSimple";
	system("rm -f -r Archivos/testEstrategiaDiferidaSimple*");

	Archivo* archivo = new Archivo(path);
	this->estrategia = new EstrategiaRecursoEscrituraDiferida(archivo, tamanioBloque);

	Bytes hola("holas");
	estrategia->escribir(hola,0);
	this->estrategia->imprimirBuffer();

	Bytes chau("chaus");
	estrategia->escribir(chau,5);
	this->estrategia->imprimirBuffer();

	Bytes biza("bizar");
	estrategia->escribir(biza,10);
	this->estrategia->imprimirBuffer();

	Bytes dani("danie");
	estrategia->escribir(dani,5);
	this->estrategia->imprimirBuffer();

	estrategia->escribir(biza,10);
	this->estrategia->imprimirBuffer();

	estrategia->escribir(dani,5);
	this->estrategia->imprimirBuffer();

	estrategia->escribir(hola,0);
	this->estrategia->imprimirBuffer();

	estrategia->escribir(dani,5);

	this->estrategia->imprimirBuffer();

	estrategia->escribir(chau,5);
	estrategia->escribir(biza,10);
	estrategia->escribir(hola,0);

	assert(estrategia->leer(5,5).toString() == "chaus", "Test leer chaus");
	assert(estrategia->leer(0,5).toString() == "holas", "Test leer holas");
	assert(estrategia->leer(10,5).toString() == "bizar", "Test leer bizar");
	this->estrategia->imprimirBuffer();

	delete estrategia;
}


void TestEstrategiaDiferida::testComplejo() {

	cantBytes tamanioBloque = 5;
	string path = "Archivos/testEstrategiaDiferidaComplejo";
	system("rm -f -r Archivos/testEstrategiaDiferidaComplejo*");

	Archivo* archivo = new Archivo(path);
	this->estrategia = new EstrategiaRecursoEscrituraDiferida(archivo, tamanioBloque);

	vector<Bytes> datos;

	datos.push_back(Bytes("DAT01"));
	datos.push_back(Bytes("DAT02"));
	datos.push_back(Bytes("DAT03"));
	datos.push_back(Bytes("DAT04"));
	datos.push_back(Bytes("DAT05"));
	datos.push_back(Bytes("DAT06"));
	datos.push_back(Bytes("DAT07"));
	datos.push_back(Bytes("DAT08"));
	datos.push_back(Bytes("DAT09"));
	datos.push_back(Bytes("DAT10"));
	datos.push_back(Bytes("DAT11"));
	datos.push_back(Bytes("DAT12"));
	datos.push_back(Bytes("DAT13"));
	datos.push_back(Bytes("DAT14"));
	datos.push_back(Bytes("DAT15"));
	datos.push_back(Bytes("DAT16"));
	datos.push_back(Bytes("DAT17"));
	datos.push_back(Bytes("DAT18"));
	datos.push_back(Bytes("DAT19"));
	datos.push_back(Bytes("DAT20"));

	for (int i = 0; i < 20; i++) {
		this->estrategia->escribir(datos[i],i*5);
	}

	for (int i = 0; i < 1000 ; i++) {

	  unsigned int componente = (rand() % 20);

	  Bytes dato = estrategia->leer(componente*5,5);
	  string nroTest = intToString(i);

	  assert(dato.toString() == datos[componente].toString(),"Test " + dato.toString() + " Nro: " + nroTest);
	  if ((i % 50) == 0) {
		  this->estrategia->imprimirBuffer();
	  }
	}

	delete estrategia;
}
